package com.zsp.test.LK;

public class LK1 {
    public static void main(String[] args) {

    }

    //  加法逻辑
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 创建一个虚拟头节点
        ListNode dummy = new ListNode(0); //dummy 是一个虚拟节点，用于简化链表的操作。最终结果链表从 dummy.next 开始
        // 用于构建结果链表的指针
        ListNode current = dummy; // current 是一个指针，用于在结果链表中添加新节点
        // 初始化进位为0
        int carry = 0; //carry 是一个整数，用于存储每次加法的进位

        //遍历链表并计算和
        while (l1 != null || l2 != null) { // 当l1或l2不为空时继续循环
            int x = (l1 != null) ? l1.val : 0; // 如果l1不为空，取l1的值，否则取0     9
            int y = (l2 != null) ? l2.val : 0; // 如果l2不为空，取l2的值，否则取0     6
            int sum = x + y + carry; // 计算当前位的和   15
            carry = sum / 10; // 更新进位,进几  15/10 = 1   15%10 = 5
            current.next = new ListNode(sum % 10); // 创建新节点存储当前位的结果
            current = current.next; // 移动current指针到下一个节点
            if (l1 != null) l1 = l1.next; // 移动l1指针到下一个节点
            if (l2 != null) l2 = l2.next; // 移动l2指针到下一个节点
        }
        if (carry > 0) { // 如果还有进位
            current.next = new ListNode(carry); // 创建新节点存储进位
        }

        return dummy.next; // 返回结果链表的头节点
    }
}

// 定义链表节点类
class ListNode{
    int val; // 节点存储的值
    ListNode next;// 指向下一个节点的指针

    // 构造函数，用于创建一个新节点
    ListNode(int x){
        val = x;
    }
}
